package com.andy.blog.common.reponse;

import com.andy.blog.common.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

/**
 * Created by andy on 2023/4/8 19:40
 */
public class GeneralResponseResult<T> extends ResponseResult {

    /**
     * 数据体
     */
    private T data;
    /**
     * 响应时间
     */
    private String time;

    public GeneralResponseResult() {
        super();
    }

    public GeneralResponseResult(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }


    public GeneralResponseResult(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public GeneralResponseResult(String code, String msg, T data, String time) {
        super(code, msg);
        this.data = data;
        this.time = time;
    }

    /**
     * 成功 不携带任何数据
     *
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> success(BlogResultCode blogResultCode) {
        return result(blogResultCode.getCode(), blogResultCode.getMsg(), null);
    }

    /**
     * 成功 携带data
     *
     * @param data 数据
     * @param <T>  返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> success(T data) {
        return result(BlogResultCode.SUCCESS_000000.getCode(), BlogResultCode.SUCCESS_000000.getMsg(), data);
    }

    /**
     * 成功
     */
    public static <T> GeneralResponseResult<T> success() {
        return result(BlogResultCode.SUCCESS_000000.getCode(), BlogResultCode.SUCCESS_000000.getMsg(), null);
    }

    /**
     * 失败
     */
    public static <T> GeneralResponseResult<T> error() {
        return result(BlogResultCode.BLOG_999999.getCode(), BlogResultCode.BLOG_999999.getMsg(), null);
    }

    /**
     * 业务处理失败
     *
     * @param blogResultCode code信息
     * @param <T>            返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> error(BlogResultCode blogResultCode) {
        return result(blogResultCode.getCode(), blogResultCode.getMsg(), null);
    }

    /**
     * 业务处理失败
     *
     * @param errCode code信息
     * @param errMsg  msg信息
     * @param <T>     返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> error(String errCode, String errMsg) {
        if (StringUtils.isAnyBlank(errCode, errMsg)) {
            return error(BlogResultCode.BLOG_999999);
        }
        return result(errCode, errMsg, null);
    }

    /**
     * 返回自定义错误
     *
     * @param errMsg 错误信息
     * @param <T>    返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> error(String errMsg) {
        if (StringUtils.isBlank(errMsg)) {
            return error(BlogResultCode.BLOG_999999);
        }
        return result(BlogResultCode.BLOG_999999.getCode(), errMsg, null);
    }

    /**
     * 警告
     */
    public static <T> GeneralResponseResult<T> warn() {
        return result(BlogResultCode.BLOG_555555.getCode(), BlogResultCode.BLOG_555555.getMsg(), null);
    }

    /**
     * 警告
     *
     * @param blogResultCode code信息
     * @param <T>            返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> warn(BlogResultCode blogResultCode) {
        return result(blogResultCode.getCode(), blogResultCode.getMsg(), null);
    }

    /**
     * 警告
     *
     * @param errMsg 错误信息
     * @param <T>    返回对象
     * @return 返回固定响应体
     */
    public static <T> GeneralResponseResult<T> warn(String errMsg) {
        if (StringUtils.isBlank(errMsg)) {
            return error(BlogResultCode.BLOG_555555);
        }
        return result(BlogResultCode.BLOG_555555.getCode(), errMsg, null);
    }

    /**
     * 响应
     *
     * @param code 响应码
     * @param msg  响应信息
     * @param data 响应数据
     */
    private static <T> GeneralResponseResult<T> result(String code, String msg, T data) {
        return new GeneralResponseResult<>(code, msg, data, DateUtils.formatDate(new Date(), DateUtils.YYYY_MM_DD_HH_MM_SS));
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

